/*****************************
封装步进电机底层驱动代码部分
*****************************/

#include "Arduino.h"       //调用arduino库函数
#include <AccelStepper.h>  //调用步进电机库函数
#include <MultiStepper.h>  //调用步进电机库函数

//声明A9,A10引脚处的步进电机
AccelStepper stepper_1(1, A10, A9);
//声明steppers电机组.
MultiStepper steppers;


/*********************
功能：步进电机引脚初始化
*********************/
void stepper_init(){
  pinMode(EN, OUTPUT);
  //步进电机驱动板使能
  digitalWrite(EN, LOW);
  //将声明的stepper_1步进电机添加到电机组中
  steppers.addStepper(stepper_1);
  //设定步进电机速度
  set_stepper_vel(stepper_speed);
}


/***********************************************
功能：设定步进电机速度函数
参数：target_vel:设定步进电机速度，速度范围0~3200
这里的速度表示步进电机的脉冲数，也就是每秒脉冲数.
即步进电机每秒最多转动多少步
***********************************************/
void set_stepper_vel(double target_vel){
  stepper_1.setMaxSpeed(target_vel);
}


/*******************************************************
功能：丝杠滑块移动距离函数
参数：target_distance:丝杆上的滑块需要移动的距离。单位：毫米
*******************************************************/
void move_distance(double target_distance){
  double distance = 0;
  distance = (target_distance / LEAD * TOTAL_STEP) * 2.0;
  stepperMove(distance);
}


/*******************************************************
功能：步进电机转动圈数函数
参数：target_rotations:步进电机需要转动的圈数。单位：圈
*******************************************************/
void move_rotations(double target_rotations){
  double step_move = 0;
  step_move = target_rotations * TOTAL_STEP * 2;
  //Serial.print("需要移动的总步数:");
  //Serial.println(step_move);
  stepperMove(step_move);
}

/***************************************************
步进电机转动函数.调用moveTo，
runSpeedToPosition，setCurrentPosition实现步进电机转动
****************************************************/
void stepperMove(long _x){              
    long positions[2];
    positions[0] = _x;
    steppers.moveTo(positions);
    steppers.runSpeedToPosition();
    stepper_1.setCurrentPosition(0);
}